package com.itjh.filter;

import com.alibaba.fastjson.JSONObject;
import com.itjh.pojo.MyResponseResult;
import com.itjh.utils.JwtUtils;
import com.itjh.utils.ThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

/**
 * Description:
 *
 * @Create 2025/1/21 15:09
 */
//@WebFilter(urlPatterns = "/*")
//@Component
public class LoginFilter implements Filter {
//    @Autowired
    private JwtUtils jwtUtils;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        //获取用户的请求路径,为了有更多的功能,需要将 ServletRequest 转成子接口类型
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        /*
            1: 获取用户的请求路径,如果是 去登陆,直接放行
            2: 根据请求头 Token 获取令牌
            3: 校验令牌是否合法,如果合法则放行
            4: 如果不合法,则响应一个错误状态对象
         */
        //1: 获取用户的请求路径,如果是登陆,直接放行
        String uri = request.getRequestURI(); //获取资源路径:/login
//        String url = request.getRequestURL().toString(); //获取完整路径:http://localhost:8080/login
        if ("/login".equals(uri)){
            chain.doFilter(request,response);
            return;
        }
        //2: 根据请求头 Token 获取令牌
        String token = request.getHeader("token");
        //3: 校验令牌是否合法,如果合法则放行
        Map<String, Object> map = jwtUtils.parseJwt(token);
        if (map == null){
            //说明令牌过期了或不合法，直接响应一个错误信息即可
            MyResponseResult<Object> result = MyResponseResult.error("NOT_LOGIN");
            // 把result响应给前端(需要把对象转json) 由于目前代码还没有执行controller,因此需要我们自己手动转成json,并手动响应数据
            //把MyResponseResult对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
            String jsonString = JSONObject.toJSONString(result);
            response.getWriter().write(jsonString);
            return;
        }
        // 合法的情况  先使用ThreadLocal  本地线程保存一个变量,以便于后续使用
        ThreadLocalUtils.setValue(map);
        chain.doFilter(request,response);
    }
}
